#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <string.h>
#include <ctype.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netdb.h>
#include <errno.h>
#include <time.h>
#include "files.h"

FILE *CONF;
FILE *LOAD_AVERAGE;

/***********************************************************
 *
 *	Cargo archivo de configuracion en la estructura 
 *	stConfig
 *	
 *	TODO: Se podrian agregar valores default para
 *	      para cuando haya algun valor loco o no 
 *	      exista el valor en el archivo de conf
 ***********************************************************/
void loadConfiguration(CONFIG* stConfig){

	char parameter[128];
	CONF = openFile(CONFIG_PATH, "r");

	if (getConfigParameter("ACR_IP", parameter)){
		parameter[strlen(parameter)-1]='\0';
		strcpy((char*)stConfig->acrIp, parameter);
	}
	
	if (getConfigParameter("ACR_PORT", parameter)){
		stConfig->acrPort = atoi(parameter);
	}
	
	/*-- 
		No hace falta. El id es para el ACR, donde
		puede usar el socket, o cualquier identificador
		que desee.

	if (getConfigParameter("ADP_ID", parameter)){
		strcpy((char*)stConfig->adpID, parameter);
	}
	--*/

	if (getConfigParameter("ADP_IP", parameter)){
		parameter[strlen(parameter)-1]='\0';
		strcpy((char*)stConfig->adpIp, parameter);
	}
	
	if (getConfigParameter("ADP_PORT", parameter)){
		stConfig->adpPort = atoi(parameter);
	}
	
	if (getConfigParameter("ADP_MAX_MEMORY", parameter)){
		stConfig->adpMaxMemory = atoi(parameter);
	}

	if (getConfigParameter("ADP_MAX_PCB_QTY", parameter)){
		stConfig->adpMaxPcbQty = atoi(parameter);
	}

	if (getConfigParameter("ADP_QUANTUM", parameter)){
		stConfig->adpQuantum =atoi(parameter);
	}

	if (getConfigParameter("ADP_LA_1", parameter)){
		stConfig->adpLoadAverage1 = atof(parameter);
	}

	if (getConfigParameter("ADP_LA_2", parameter)){
		stConfig->adpLoadAverage2 = atof(parameter);
	}
	
	if (getConfigParameter("ADP_TIME_LA_2", parameter)){
		stConfig->adpLoadAverageTime2 = atoi(parameter);
	}	

	closeFile(CONF);
}

/***********************************************************
 *
 *	Toma el valor del parametro solicitado del archivo 
 *	de configuracion
 *
 ***********************************************************/
int getConfigParameter(char* sClave, char* sResultado){
	return getParameter(sClave, sResultado, CONF);
}

/***********************************************************
 *
 *	Toma el valor del parametro solicitado del archivo 
 *	de configuracion
 *
 ***********************************************************/
void getLoadAverage(char* loadAverage){
	char line[LOAD_AVERAGE_SIZE];
	LOAD_AVERAGE = openFile(LOAD_AVERAGE_PATH, "r");
	rewind(LOAD_AVERAGE);
	memset(line, '\0', LOAD_AVERAGE_SIZE);
	fgets(line, LOAD_AVERAGE_SIZE, LOAD_AVERAGE);
	strcpy(loadAverage, strtok(line ," "));
	closeFile(LOAD_AVERAGE);
}

/***********************************************************
 *
 *	Toma el valor del parametro solicitado del archivo 
 *	especificado
 *
 ***********************************************************/
int getParameter(char* sClave, char* sResultado, FILE* file){

	char linea[MAXLINE];
	char* clave;
	int largoClave;

	rewind(file);

	/*-- Recorro linea por linea --*/
	while(!feof(file)){
	   memset(linea, '\0', MAXLINE);
	   fgets(linea, MAXLINE, CONF); 
	   clave=(char*)malloc(sizeof(char)*MAXLINE);
	   memset(clave, '\0', MAXLINE);
	   clave=strtok(linea, "=");

	   /*-- Si coincide, retorno el valor --*/
           if(strcmp(clave,sClave)==0){
		largoClave=strlen(clave)+1;
		strcpy(clave,linea+largoClave);
		memset(clave+strlen(clave),'\0',MAXLINE-strlen(clave));
		strcpy(sResultado,clave);
		return 1;
	    }

	}
	return 0;   
}

/***********************************************************
 *
 *	Toma el valor del parametro solicitado del archivo 
 *	de configuracion
 *
 ***********************************************************/
void closeFile (FILE* file){
	if(fclose(file)<0){
		perror( "Error: El archivo no fue cerrado correctamente\n" );
		/*-- TODO:Agregar log -- */
	}
}

/***********************************************************
 *
 *	Toma el valor del parametro solicitado del archivo 
 *	de configuracion
 *
 ***********************************************************/
FILE* openFile (const char* fileName, const char * mode){

    	FILE* logFile;

	if((logFile=fopen(fileName, mode))==NULL){
		perror("Error: El archivo no fue abierto correctamente");
		/*-- exit(EXIT_FAILURE); --*/
	}
    	return logFile;
}
